<?php

namespace App\Models\Traits;

use App\Models\Site;
use Carbon\Carbon;
use Cache;
use DB;
use App\Models\User;
use App\Handlers\GetViewCountHandler;

trait GetViewCountsHelper
{

    // 缓存相关配置
    protected $cache_key = 'zhuanfa_all_users';
    protected $cache_expire_in_minutes = 65;
    // 扣量配置参数

    // 更新用户浏览量数据
    public function updateViewCount()
    {
        if ($data = $this->getViewCounts()) {

            foreach($data as $key => $val) {
                //  忽略users表中不存在的用户数据
                if (User::find($key)) {
                    $insertData = [
                        'user_id' => $key,
                        'date' => $this->key2date(key($val)),
                        'counts' => $val[key($val)]['iv'] ?: 0
                    ];
                    $this->insertDb($insertData);
                }
            }
            return true;
        }
        return false;
    }
    // 对于扣量 进行单独操作
    // 传入 $data = ['user_id' => 1, 'date' => '2019-01-01', 'counts' => 999]
    /*
    public function testKouliang($data)
    {
      $where = [
          ['user_id', $data['user_id']],
          ['date', $data['date']]
      ];
      if (!$user = User::find($data['user_id'])) {
          // 用户不存在 退出
          return;
      }
      // 扣量阈值
      $kouliang_min = $user->kouliang_min == -1 ? setting('kouliang_min') : $user->kouliang_min;
      // 扣量比例
      $kouliang = $user->kouliang == -1 ? setting('kouliang') : $user->kouliang;

      // 执行扣量操作
      // 获取已入库的数据
      $info = $this->where($where)->first();
      if ($info) $old_data = $info['counts'];
      else $old_data = 0;
      // 对于已经入库的数据 不进扣量， 只对新增的浏览量扣。
      $new_counts = $data['counts'] - $old_data;
      // 但是要对已入库的进行阈值 检查
      // 默认是扣了0
      $kouliang_counts = 0;
      // 什么时候才扣量   $kouliang 扣量比例 > 0  && $kouliang_min < $data['counts'] -- 获取到的真实访问量
      if ($kouliang > 0 && $kouliang_min < $data['counts']) {
          // 比例大于0 数据大于扣量阈值
          // 只对新增的数据（ $new_counts）进行扣量
          $kouliang_counts = ($new_counts*($kouliang / 100)); // 扣了多少
          $new_counts = $new_counts - $kouliang_counts;
      }
      return '用户id: ' . $data['user_id'] . '，已入库浏览量：' . $old_data . '，新增流览量：' . ($data['counts'] - $old_data) . '，扣量比例：' . $kouliang . '，扣量阈值：' . $kouliang_min . '，扣量值：' .$kouliang_counts . '，实际需要入库：' . $new_counts;
    }
    */
    // 将获取到的数据插入数据库
    protected function insertDb($data)
    {
        //dd($data);
        $where = [
            ['user_id', $data['user_id']],
            ['date', $data['date']]
        ];
        // 扣量操作
        if (!$user = User::find($data['user_id'])) {
            // 用户不存在 退出
            return;
        }
        // 扣量阈值
        $kouliang_min = $user->kouliang_min == -1 ? setting('kouliang_min') : $user->kouliang_min;
        // 扣量比例
        $kouliang = $user->kouliang == -1 ? setting('kouliang') : $user->kouliang;

        // 执行扣量操作
        // 获取已入库的数据
        $info = $this->where($where)->first();
        if ($info) $old_data = $info['counts'] + $info['kouliang_nums'];
        else $old_data = 0;
        // 对于已经入库的数据 不进扣量， 只对新增的浏览量扣。
        $new_counts = $data['counts'] - $old_data;
        // 但是要对已入库的进行阈值 检查
        // 默认是扣了 0
        $kouliang_counts = 0;
        // 什么时候才扣量   $kouliang 扣量比例 > 0  && $kouliang_min < $data['counts'] -- 获取到的真实访问量
        if ($kouliang > 0 && $kouliang_min < $data['counts'] && $new_counts > 0) {
            // 比例大于0 数据大于扣量阈值
            // 只对新增的数据（ $new_counts）进行扣量
            $kouliang_counts = ($new_counts*($kouliang / 100)); // 扣了多少
            $new_counts = $new_counts - $kouliang_counts;  // 要增加的浏览量
        }

        if ($info) {
            if (($info->counts + $info->kouliang_nums) < $data['counts']) {
                $info->counts = $info->counts + $new_counts;
                $info->kouliang_nums = $info->kouliang_nums + $kouliang_counts;
                return $info->save();
            }
        } else {
            $data['counts'] = $new_counts;
            $data['kouliang_nums'] = $kouliang_counts;
            return $this->create($data);
        }
    }
    protected function key2date($str) {
        $array = str_split($str);
        return $array[0] . $array[1] . $array[2]  . $array[3]  . '-' . $array[4]  . $array[5]  . '-' . $array[6] . $array[7];
    }
    public function getAllUsers()
    {
        // 从缓存中获取所有用户 ID
        return Cache::remember($this->cache_key, $this->cache_expire_in_minutes, function(){
            return \App\Models\User::all()->pluck('id')->implode(',');
        });
    }
    protected function getViewCounts()
    {
        $view = new GetViewCountHandler;
        return $view->get($this->getAllUsers());
    }
    protected function getData()
    {
        // return Cache::remember('zhuanfa_view_counts', 20, function() {
            return $this->getViewCounts();
        // });
    }
}
